package cn.csg.ams.collect2.poptopics.dao;

import cn.csg.ams.collect2.poptopics.entity.bo.MkPrPfOutageRecoveryMonBO;
import cn.csg.ams.collect2.poptopics.entity.vo.MkPrPfOutageRecoveryMonVO;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;
import java.util.Map;

/**
 * @author: zhanggang
 * @ClassName: MkPrPfOutageRecoveryMonDao
 * @date: 2023-11-21 15:15:00
 * @Description: 实时停复电监测(mk_pr_pf_outage_recovery_mon)表数据库访问层
 */
public interface MkPrPfOutageRecoveryMonDao extends BaseMapper<MkPrPfOutageRecoveryMonBO> {


    /**
     * 条件查询所有
     *
     * @param areaCode         地区编码
     * @param lineNo           线路编号
     * @param taNo             台区编号
     * @param runMeterId       运行电能表标识
     * @param branchRunMeterId 分支运行电能表标识
     * @param userTypes        用户类型
     * @return List<MkPrPfOutageRecoveryMonVO>
     */
    List<MkPrPfOutageRecoveryMonVO> queryList(@Param("areaCode") String areaCode,
                                              @Param("lineNo") String lineNo,
                                              @Param("taNo") String taNo,
                                              @Param("runMeterId") String runMeterId,
                                              @Param("branchRunMeterId") String branchRunMeterId,
                                              @Param("userTypes") List<String> userTypes);

    /**
     * 条件查询所有
     *
     * @param areaCode    地区编码
     * @param runMeterIds 运行电能表标识
     * @return List<MkPrPfOutageRecoveryMonVO>
     */
    List<MkPrPfOutageRecoveryMonVO> queryList2(@Param("areaCode") String areaCode, @Param("runMeterIds") List<String> runMeterIds);

    /**
     * @Title:insertBatch
     * @Description:批量新增数据（MyBatis原生foreach方法）
     * @date: 2023-11-21 15:15:00
     * @params: entities List<MkPrPfOutageRecoveryMon> 实例对象列表
     * @return：int 影响行数
     * @throw：
     */
    int insertBatch(@Param("entities") List<MkPrPfOutageRecoveryMonVO> entities);


    /**
     * 根据对象id更新停电状态为复电
     *
     * @param runMeterId    运行电能表标识
     * @param runMeterIds   运行电能表标识
     * @param taNo          台区编号
     * @param lineNo        线路编号
     * @param outageEndTime 复电时间
     * @param restoreSource 复电来源（1-告警流研判，2-告警批研判，3-计划工单，4-故障工单，5-电压采集）
     * @param startTime     复电研判开始时间
     * @return int
     */
    int recover(@Param("runMeterId") String runMeterId,
                @Param("runMeterIds") List<String> runMeterIds,
                @Param("taNo") String taNo,
                @Param("LineNo") String lineNo,
                @Param("outageEndTime") String outageEndTime,
                @Param("restoreSource") String restoreSource,
                @Param("startTime") Long startTime);

    /**
     * 根据台区编号查询gisId
     *
     * @param taNo 台区编号
     * @return String
     */
    List<String> getGisIdByTaNo(@Param("taNo") String taNo);


    /**
     * 根据gisId查询计划停电事件id
     *
     * @param gisIds    变压器id
     * @param startDate 停电时间前半小时
     * @param endDate   停电时间后半小时
     */
    Map<String, Object> getPlanEvenIdByGisId(@Param("gisIds") List<String> gisIds, @Param("startDate") String startDate, @Param("endDate") String endDate);


    /**
     * 根据gisId查询故障停电事件id
     *
     * @param gisIds    变压器id
     * @param startDate 停电时间前半小时
     * @param endDate   停电时间后半小时
     */
    Map<String, Object> getFaultEvenIdByGisId(@Param("gisIds") List<String> gisIds, @Param("startDate") String startDate, @Param("endDate") String endDate);


    /**
     * 根据计划停电事件id，查询所有受影响的台区编号
     *
     * @param planEvenId 计划停电事件id
     * @return List<String>
     */
    List<String> getTaNosByPlanEvenId(@Param("planEvenId") String planEvenId);


    /**
     * 根据故障停电事件id，查询所有受影响的台区编号
     *
     * @param faultEvenId 故障停电事件id
     * @return List<String>
     */
    List<String> getTaNosByFaultEvenId(String faultEvenId);


    String getPlanEvenIdByLineNo(@Param("lineNo") String lineNo, @Param("startDate") String startDate, @Param("endDate") String endDate);

    String getFaultEvenIdByLineNo(@Param("lineNo") String lineNo, @Param("startDate") String startDate, @Param("endDate") String endDate);


    /**
     * 根据台区编号匹配计划停电
     *
     * @param taNo      台区编号
     * @param leftTime  停电开始时间前30分钟
     * @param rightTime 停电开始时间后30分钟
     * @return Map<String, String>
     */
    Map<String, String> getPlanOutageEvent(@Param("taNo") String taNo, @Param("leftTime") String leftTime, @Param("rightTime") String rightTime);


    /**
     * 根据台区编号匹配故障停电
     *
     * @param taNo      台区编号
     * @param leftTime  停电开始时间
     * @param rightTime 停电开始时间前30分钟
     * @return Map<String, String>
     */
    Map<String, String> getfaultOutageEvent(@Param("taNo") String taNo, @Param("leftTime") String leftTime, @Param("rightTime") String rightTime);


    /**
     * 更新停电推送状态与推送时间
     *
     * @param objId           对象id
     * @param outageEventId   事件id
     * @param runMeterId      运行电表标识
     * @param alarmPushStatus 推送状态
     * @param failReason      失败原因
     */
    void updateOutagePushTime(@Param("objId") String objId,
                              @Param("outageEventId") String outageEventId,
                              @Param("runMeterId") String runMeterId,
                              @Param("alarmPushStatus") String alarmPushStatus,
                              @Param("failReason") String failReason);


    /**
     * 更新复电推送状态与推送时间
     *
     * @param objId                 对象id
     * @param outageEventId         事件id
     * @param runMeterId            运行电表标识
     * @param restorePushStatus     推送状态
     * @param restorePushFailReason 失败原因
     */
    void updateRestorePushTime(@Param("objId") String objId,
                               @Param("outageEventId") String outageEventId,
                               @Param("runMeterId") String runMeterId,
                               @Param("restorePushStatus") String restorePushStatus,
                               @Param("restorePushFailReason") String restorePushFailReason);


    /**
     * 查询复电更新的数据
     *
     * @param runMeterId 运行电能表标识
     * @param taNo       台区编号
     * @param startTime  复电数据接收时间
     * @return List<MkPrPfOutageRecoveryMonVO>
     */
    List<MkPrPfOutageRecoveryMonVO> getRecoverData(@Param("runMeterId") String runMeterId, @Param("taNo") String taNo, @Param("startTime") Long startTime);


    /**
     * 推送复电数据到datahub后，更新复电更新的数据
     *
     * @param runMeterId            运行电能表标识
     * @param taNo                  台区编号
     * @param startTime             复电数据接收时间
     * @param restorePushStatus     复电推送状态
     * @param restorePushFailReason 推送失败原因
     */
    void updateRecoveryMonDao(@Param("runMeterId") String runMeterId,
                              @Param("taNo") String taNo,
                              @Param("startTime") Long startTime,
                              @Param("restorePushStatus") String restorePushStatus,
                              @Param("restorePushFailReason") String restorePushFailReason);


    List<MkPrPfOutageRecoveryMonVO> getListByLineNoAndNotTaNo(@Param("lineNo") String lineNo, @Param("taNo") String taNo);

    /**
     * 获取线路下各个对象的停电数量
     *
     * @param lineNo 线路编号
     * @return Map<String, Long>
     */
    List<Map<String, Object>> getObjCountByLineNo(String lineNo);

    /**
     * 更新elink推送状态
     *
     * @param objId           对象id
     * @param outageEventId   事件id
     * @param runMeterId      运行电表标识
     * @param elinkPushStatus elink推送状态
     */
    void updateElinkPushStatus(@Param("objId") String objId,
                               @Param("outageEventId") String outageEventId,
                               @Param("runMeterId") String runMeterId,
                               @Param("elinkPushStatus") String elinkPushStatus);


    /**
     * 更新损失负荷
     *
     * @param outageStartTime   停电日期（‘yyyy-MM-dd’）
     * @param dataPart          时间分区
     * @param yesterdayDataPart 昨天的时间分区
     */
    void updateLossLoad(@Param("outageStartTime") String outageStartTime, @Param("dataPart") int dataPart, @Param("yesterdayDataPart") int yesterdayDataPart);

}
